/**
 * 工具函数文件
 * @author 普德施 pds.inc
 */

/**
 * Parse the time to string
 * @param {(Object|string|number)} time
 * @param {string} cFormat
 * @returns {string | null}
 */
 import { saveAs } from 'file-saver'
 import JSZip from 'jszip'
 import { Message } from 'element-ui'

//  export function parseTime(time, cFormat) {
//     if (arguments.length === 0 || !time) {
//       return null
//     }
//     const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
//     let date
//     // else {
//     //   if ((typeof time === 'string')) {
//     //     if ((/^[0-9]+$/.test(time))) {
//     //       // support "1548221490638"
//     //       time = parseInt(time)
//     //     } else {
//     //       time = time.replace(new RegExp(/-/gm), '/')
//     //     }
//     //   }

//     //   if ((typeof time === 'number') && (time.toString().length === 10)) {
//     //     time = time * 1000
//     //   }
//     //   date = new Date(time)
//     // }
//     if ((typeof time === 'string')) {
//       if ((/^[0-9]+$/.test(time))) {
//         // support "1548221490638"
//         time = parseInt(time)
//       } else {
//         time = time.replace(new RegExp(/-/gm), '/')
//       }
//     }
//     if ((typeof time === 'number') && (time.toString().length === 10)) {
//       time = time * 1000
//     }

//     date = new Date(time)

//     if (typeof time === 'object') {
//       date = time
//     }
//     const formatObj = {
//       y: date.getFullYear(),
//       m: date.getMonth() + 1,
//       d: date.getDate(),
//       h: date.getHours(),
//       i: date.getMinutes(),
//       s: date.getSeconds(),
//       a: date.getDay()
//     }
//     const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
//       const value = formatObj[key]
//       // Note: getDay() returns 0 on Sunday
//       if (key === 'a') {
//         return ['日', '一', '二', '三', '四', '五', '六'][value ]
//       }
//       return value.toString().padStart(2, '0')
//     })
//     return time_str
//   }

  // /**
  //  * @param {number} time
  //  * @param {string} option
  //  * @returns {string}
  //  */
  // export function formatTime(time, option) {
  //   if (('' + time).length === 10) {
  //     time = parseInt(time) * 1000
  //   } else {
  //     time = +time
  //   }
  //   const d = new Date(time)
  //   const now = Date.now()

  //   const diff = (now - d) / 1000

  //   if (diff < 30) {
  //     return '刚刚'
  //   } else if (diff < 3600) {
  //     // less 1 hour
  //     return Math.ceil(diff / 60) + '分钟前'
  //   } else if (diff < 3600 * 24) {
  //     return Math.ceil(diff / 3600) + '小时前'
  //   } else if (diff < 3600 * 24 * 2) {
  //     return '1天前'
  //   } else {
  //     // TODO document why this block is empty
  //   }
  //   if (option) {
  //     return parseTime(time, option)
  //   } else {
  //     return (d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分')
  //   }
  // }
export const setDocTitle = (title) => {
   document.title = title
}
  /**
   * @param {string} url
   * @returns {Object}
   */
  export function param2Obj(url) {
    const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
    if (!search) {
      return {}
    }
    const obj = {}
    const searchArr = search.split('&')
    searchArr.forEach(v => {
      const index = v.indexOf('=')
      if (index !== -1) {
        const name = v.substring(0, index)
        const val = v.substring(index + 1, v.length)
        obj[name] = val
      }
    })
    return obj
  }

  /**
   * get document title
   * @param {*} pageTitle 页面标题
   * @param {*} title 网站名称
   * @returns string
   */
  export function getPageTitle(pageTitle, title) {
    if (pageTitle) {
      return `${pageTitle} - ${title}`
    }
    return `${title}`
  }

  /**
   * @param {string} url
   * @returns {Object}
   */
  export function getQueryObject(url) {
    url = url == null ? window.location.href : url
    const search = url.substring(url.lastIndexOf('?') + 1)
    const obj = {}
    const reg = /([^?&=]+)=([^?&=]*)/g
    search.replace(reg, (rs, $1, $2) => {
      const name = decodeURIComponent($1)
      let val = decodeURIComponent($2)
      val = String(val).trim()
      if (val === 'true' || val === 'false') {
        val = Boolean(val)
      }
      obj[name] = val
      return rs
    })
    return obj
  }

  /**
   * 去除index结尾的vue文件
   *
   * @param String str
   * @returns String
   */
  export function spliceIndex(str) {
    if (str) {
      const arr = str.split('/')
      if (arr.length) {
        if (arr[arr.length - 1] === 'index') {
          arr[arr.length - 1] = ''
          str = arr.filter(Boolean).join('/')
        }
      }
    }

    return str
  }

  /**
   * @param {Function} func
   * @param {number} wait
   * @param {boolean} immediate
   * @return {*}
   */
  // export function debounce(func, wait, immediate) {
  //   let timeout, args, context, timestamp, result

  //   const later = function() {
  //     // 据上一次触发时间间隔
  //     const last = +new Date() - timestamp

  //     // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
  //     if (last < wait && last > 0) {
  //       timeout = setTimeout(later, wait - last)
  //     } else {
  //       timeout = null
  //       // 如果设定为immediate===true，因为开始边界已经调用过了此处无需调用
  //       if (!immediate) {
  //         result = func.apply(context, args)
  //         if (!timeout) {
  //           context = args = null
  //         }
  //       }
  //     }
  //   }
  //   return function(...args) {
  //     context = this
  //     timestamp = +new Date()
  //     const callNow = immediate && !timeout
  //     // 如果延时不存在，重新设定延时
  //     if (!timeout) {
  //       timeout = setTimeout(later, wait)
  //     }
  //     if (callNow) {
  //       result = func.apply(context, args)
  //       context = args = null
  //     }

  //     return result
  //   }
  // }

  // 保留n位正数小数
  export function positiveDecima(value, num = 2) {
    const obj = {
      2: new RegExp(/^\d*(?:\.\d{0,2})?$/),
      4: new RegExp(/^\d*(?:\.\d{0,4})?$/)
    }
    return ('' + value) // 第一步：转成字符串
    .replace(/[^\d^\.]+/g, '') // 第二步：把不是数字，不是小数点的过滤掉
    .replace(/^0+(\d)/, '$1') // 第三步：第一位0开头，0后面为数字，则过滤掉，取后面的数字
    .replace(/^\./, '0.') // 第四步：如果输入的第一位为小数点，则替换成 0. 实现自动补全
    .match(obj[num])
  }

  // 深拷贝
  export function deepCopy(source) {
    if (!source && typeof source !== 'object') {
      throw new Error('error arguments', 'deepClone')
    }
    const targetObj = source.constructor === Array ? [] : {}
    Object.keys(source).forEach(keys => {
      if (source[keys] && typeof source[keys] === 'object') {
        targetObj[keys] = deepCopy(source[keys])
      } else {
        targetObj[keys] = source[keys]
      }
    })
    return targetObj
  }

  // 获取url参数
  export function parseParams(val) {
    return getQueryObject()
    // const a = val.split('?')
    // const arr = a[1] && a[1].split('&')
    // const obj = {}
    // arr && arr.forEach(item => {
    //   const k = item.split('=')
    //   obj[k[0]] = k[1]
    // })
    // return obj
  }

  /**
     * @params A => 附件; C => 验收;
    */
  export function commonBaseUrl(type) {
    if (process.env.NODE_ENV === 'development') {
      return ''
    }
    const obj = {
      'A': 'attachment/', // 附件管理
      'B': 'settlement/', // 结决算管理
      'C': 'acceptance/', // 验收管理
      'D': 'material/', // 物资服务管理
      'E': 'expense/', // 设计监理费管理
      'F': 'supervise/' // 预警督办
    }
    return obj[type]
  }

  // 下载处理接口返回文件
  export function downloadFileFun(res, fileName) {
      // 一般来说，文件名字后端都在返回头里，前后端可以约定文件名前用 @ 符号分隔，便于取值，用其他符号也可以。
    //   const stringName = res.headers['content-disposition'].split('=')[1].replaceAll('"', '').split(',')
    //   console.log(stringName, 'ssss')
    //   const fileType = stringName.length > 1 ? 'application/zip' : res.data.type
    //   const fileName = stringName.length > 1 ? '附件信息.zip' : null
      const fileType = res.data.type
      const blob = new Blob([res.data], { type: fileType }) // application/zip就是设置下载类型，需要设置什么类型可在标题二处查看，
      // const blob = new Blob([res.data], { type: 'application/zip' }) // application/zip就是设置下载类型，需要设置什么类型可在标题二处查看，
      const url = window.URL.createObjectURL(blob) // 设置路径
      const link = window.document.createElement('a') // 创建a标签
      link.href = url
      link.setAttribute('download', fileName) // 给下载后的文件命名
    //   link.setAttribute('download', stringName[0] || stringName[0]) // 给下载后的文件命名
    //   document.body.appendChild(link)
      link.style.display = 'none'
      link.click()
      URL.revokeObjectURL(url) // 释放内存
      msgInfoEl({
        message: '文件下载完成！',
        type: 'success'
      })
  }

// 下载处理接口返回文件
export function downloadFile(res, fileName) {
    const fileType = res.data.type
    const blob = new Blob([res.data], { type: fileType })
    saveAs(blob, fileName)
}

// 地第三方依赖文件下载
export async function downFile(url) {
    const response = await fetch(url)
    const blob = await response.blob()
    return blob
}
// 本地第三方依赖单个文件下载
export async function singleDownload(row, fileName) {
    try {
        const blob = await downFile(row[0].filePath)
        saveAs(blob, fileName)
        msgInfoEl({
            message: '文件下载完成！',
            type: 'success'
        })
    } catch (_) {
        msgInfoEl({
            message: '文件下载异常',
            type: 'error'
        })
    }
}
// 本地第三方依赖多个文件下载
export async function mulDownload(row, zipFileName) {
    const fileUrls = []
    row.forEach((item, i) => {
        let strName = ''
        let num = 0
        const fileNameType = item.fileName.substring(item.fileName.lastIndexOf('.') + 1)
        const fileName = item.fileName.substring(0, item.fileName.lastIndexOf('.'))
        row.forEach((file, j) => {
            if (item.fileName === file.fileName) {
                if (i === j) {
                    strName = `${fileName}${num > 0 ? '(' + num + ')' : ''}.${fileNameType}`
                }
                num++
            }
        })
        fileUrls.push({
            url: item.filePath,
            fileName: strName
        })
    })

    try {
        const zip = new JSZip()

        const requests = fileUrls.map(async(file) => {
            const blob = await downFile(file.url)
            return zip.file(file.fileName, blob, { binary: true })
        })

        await Promise.all(requests)

        const content = await zip.generateAsync({ type: 'blob' })
        saveAs(content, zipFileName)

        msgInfoEl({
            message: '文件下载完成！',
            type: 'success'
        })
    } catch (_) {
        msgInfoEl({
            message: '文件下载异常',
            type: 'error'
        })
    }
}

const scrollTop = 0
export function disableScroll(scrollElement) {
    // 存储当前滚动位置
    const scrollTop = window.pageYOffset || document.documentElement.scrollTop
    // 添加样式，禁止滚动
    scrollElement.style.overflow = 'hidden'
    scrollElement.style.top = `-${scrollTop}px`
}

export function enableScroll(scrollElement) {
    // 移除样式，恢复滚动
    scrollElement.style.overflow = 'auto'
    scrollElement.style.top = ''
    // 恢复之前的滚动位置
    window.scrollTo(0, scrollTop)
}

// 关闭页面
export function clonePage() {
    if (window.CloseOwnerWindow) {
        return window.CloseOwnerWindow('cancel')
    } else {
        window.close()
    }
}

// 挂载Message在最外层
export function msgInfoEl(row, duration = 5 * 1000) {
    Message({
        type: row.type,
        message: row.message,
        duration: duration,
        dangerouslyUseHTMLString: true
    })
    const contentBody = window.top.document.body
    const msg = document.querySelector(`.el-message--${row.type}`)
    contentBody.appendChild(msg)
    return true
}

// table表头配置项文件生成
export const getTableColumn = (labelList, propList, widthList, details = []) => {
    return labelList.map((item, index) => {
        const elProps = {
            'show-overflow-tooltip': true
        }
        if (+widthList[index]) {
            elProps.width = `${widthList[index]}px`
        }
        if (details.length) {
            elProps.details = details[index]
        }
        return {
            label: item,
            prop: propList[index],
            elProps
        }
    })
}
